home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 60750 / 60750.xpi / chrome / chromeFiles / content / bindings / btfeedreader3.xml < prev    next >
Extensible Markup Language  |  2010-01-20  |  14KB  |  383 lines

  1. <?xml version="1.0"?>
  2.  
  3. <bindings id="feedreaderBindings"
  4.       xmlns="http://www.mozilla.org/xbl"
  5.       xmlns:html="http://www.w3.org/1999/xhtml"
  6.       xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  7.       xmlns:xbl="http://www.mozilla.org/xbl">
  8.  
  9.   <binding id="feedreader" extends="xul:box">
  10.     <content>
  11.       <xul:toolbaritem id="feedreader" flex="1">
  12.         <xul:image id="feedreader-left-cap"/>
  13.         <xul:button tooltiptext="Toggle News Sidebar" id="feedreader-sidebar-toggle"/>
  14.         <xul:button tooltiptext="Reload Feed" id="feedreader-reload" xbl:inherits="hidden=hidereloadbutton" oncommand="readFeed()"/>
  15.         <xul:button tooltiptext="Previous Item" id="feedreader-previous" oncommand="previousFeedItem(true)"/>
  16.         <xul:button tooltiptext="Next Item" id="feedreader-next" oncommand="nextFeedItem(true)"/>
  17.         <xul:hbox id="feedreader-textbox" disabled="true" xbl:inherits="width" flex="1">
  18.           <xul:toolbarbutton label="Loading..." crop="end" pack="start" anonid="feedreader-item" flex="1" type="menu-button">
  19.             <xul:menupopup position="after_end" id="feedreader-select-popup" anonid="feedreader-select-popup">
  20.             </xul:menupopup>
  21.           </xul:toolbarbutton>
  22.         </xul:hbox>
  23.         <xul:image id="feedreader-right-cap" />
  24.       </xul:toolbaritem>
  25.       <children includes="btfeed" />
  26.     </content>
  27.     <handlers>
  28.       <handler event="command">
  29.         <![CDATA[
  30.         if (event.originalTarget.hasAttribute("bt-url")) {
  31.           var subject = {};
  32.           subject.wrappedJSObject = this.brandObject;
  33.           this.observerService.notifyObservers(subject, "brandthunder", this.id);
  34.           this.brandObject.utilities.openLink(this.brandObject, event, event.originalTarget.getAttribute("bt-url"));
  35.         } else if (event.originalTarget.hasAttribute("bt-feed")) {
  36.           this.currentfeed = event.originalTarget.getAttribute("bt-feed");
  37.           this.readFeed(event.originalTarget.getAttribute("bt-feed"));
  38.           var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
  39.             this.btPrefBranch.setCharPref(currentBoom + ".currentfeed", this.currentfeed);
  40.         }
  41.         ]]>
  42.       </handler>
  43.       <handler event="popupshowing">
  44.         <![CDATA[
  45.         if (event.originalTarget.getAttribute("anonid") == "feedreader-select-popup") {
  46.           for (let i= event.originalTarget.childNodes.length - 1; i >= 0; i--) {
  47.             if (event.originalTarget.childNodes.item(i).getAttribute("bt-feed") == this.currentfeed) {
  48.               event.originalTarget.childNodes.item(i).setAttribute("checked", "true");
  49.             } else {
  50.               event.originalTarget.childNodes.item(i).removeAttribute("checked");
  51.             }
  52.           }
  53.         }
  54.         ]]>
  55.       </handler>
  56.     </handlers>
  57.     <implementation>
  58.       <constructor>
  59.         <![CDATA[
  60.         if (this.childNodes.length) {
  61.           this.currentfeed = this.childNodes[0].getAttribute('src');
  62.         } else if (this.hasAttribute("feed")) {
  63.           this.currentfeed = this.getAttribute("feed");;
  64.         } else {
  65.           return;
  66.         }
  67.         if (this.childNodes.length > 1) {
  68.           var menupopup = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-select-popup");
  69.           for (var i=0; i < this.childNodes.length; i++) {
  70.             if (this.childNodes[i].hasAttribute("src") && this.childNodes[i].hasAttribute("title")) {
  71.               var menuitem = document.createElement("menuitem");
  72.                 menuitem.setAttribute("label", childNodes[i].getAttribute("title"));
  73.                 menuitem.setAttribute("bt-feed", childNodes[i].getAttribute("src"));
  74.               menuitem.setAttribute("type", "checkbox");
  75.                 menupopup.appendChild(menuitem);
  76.             }
  77.           }
  78.         } else {
  79.           var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
  80.           feedReaderItemButton.removeAttribute("type");
  81.         }
  82.  
  83.  
  84.         this.observerService = Components.classes["@mozilla.org/observer-service;1"]
  85.                                          .getService(Components.interfaces.nsIObserverService)
  86.  
  87.         if (this.hasAttribute('brand')) {
  88.           this.brandObject = BrandThunder.clients[this.getAttribute('brand')];
  89.         }
  90.           this.btPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
  91.                                    .getService(Components.interfaces.nsIPrefService)
  92.                                     .getBranch("extensions.brandthunder.");
  93.         try {
  94.           var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
  95.           this.currentfeed = this.btPrefBranch.getCharPref(currentBoom + ".currentfeed" );
  96.         } catch(ex) {}
  97.         
  98.  
  99.         if (this.hasAttribute('numitems')) {
  100.           this.numitems = this.getAttribute('numitems');
  101.         }
  102.         if (this.hasAttribute('rotationdelay')) {
  103.           this.rotationdelay = this.getAttribute('rotationdelay') * 1000;
  104.         }
  105.         if (this.hasAttribute('sidebar')) {
  106.           this.sidebarID = this.getAttribute('sidebar');
  107.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('observes', this.sidebarID);
  108.         } else {
  109.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('hidden', true);
  110.         }
  111.  
  112.         this.readFeed();
  113.         function reloadFeed(feedreader) {
  114.           return function() {
  115.             feedreader.readFeed(feedreader.currentfeed, feedreader);
  116.           }
  117.         }
  118.         this.reloadTimer = window.setInterval(reloadFeed(this), this.reloaddelay);
  119.         ]]>
  120.       </constructor>
  121.       <destructor>
  122.           window.clearInterval(this.rotationTimer);
  123.           window.clearInterval(this.reloadTimer);
  124.       </destructor>
  125.       <field name="currentfeed"/>
  126.       <field name="feedItems">
  127.         [];
  128.       </field>
  129.       <field name="numitems">
  130.         -1;
  131.       </field>
  132.       <field name="feedIndex">
  133.         0;
  134.       </field>
  135.       <field name="selectedIndex">
  136.         0;
  137.       </field>
  138.       <field name="rotationdelay">
  139.         5000;
  140.       </field>
  141.       <field name="reloaddelay">
  142.         1800000;
  143.       </field>
  144.       <field name="itemtitleprefix">
  145.         "";
  146.       </field>
  147.       <field name="itemurlprefix">
  148.         "";
  149.       </field>
  150.       <field name="currentFeedItem">
  151.       0
  152.       </field>
  153.       <field name="rssdeckElement">
  154.         document.getAnonymousElementByAttribute(this, 'id', 'feedreader-deck');
  155.       </field>
  156.       <field name="rotationTimer">
  157.       </field>
  158.       <field name="reloadTimer">
  159.       </field>
  160.       <field name="readSrcTimer">
  161.       </field>
  162.       <field name="sidebarID">
  163.         ""
  164.       </field>
  165.       <field name="brandObject"/>
  166.       <field name="btClientBranch"/>
  167.       <field name="observerService"/>
  168.  
  169.       <method name="startFeedRotation">
  170.         <body>
  171.           <![CDATA[
  172.           function advance(feedreader) {
  173.             return function() {
  174.               feedreader.nextFeedItem();
  175.             }
  176.           }
  177.           this.rotationTimer = window.setInterval(advance(this), this.rotationdelay);
  178.           ]]>
  179.         </body>
  180.       </method>
  181.  
  182.       <method name="updateFeedItem">
  183.         <body>
  184.           <![CDATA[
  185.           if (this.feedItems == 0) {
  186.             return;
  187.           }
  188.           var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
  189.           feedReaderItemButton.setAttribute("label", this.feedItems[this.currentFeedItem].title);
  190.           feedReaderItemButton.setAttribute("tooltiptext", this.feedItems[this.currentFeedItem].title);
  191.           if (this.childNodes.length > 1) {
  192.             document.getAnonymousElementByAttribute(feedReaderItemButton, "anonid", "button").setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
  193.           } else {
  194.             feedReaderItemButton.setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
  195.           }
  196.           ]]>
  197.         </body>
  198.       </method>
  199.  
  200.  
  201.       <method name="previousFeedItem">
  202.         <parameter name="resetTimer" />
  203.         <body>
  204.           <![CDATA[
  205.           if (resetTimer) {
  206.             window.clearInterval(this.rotationTimer);
  207.             this.rotationTimer = 0;
  208.             this.startFeedRotation();
  209.           }
  210.           var numItems;
  211.           if ((this.numitems > -1) && (this.feedItems.length >= this.numitems)) {
  212.             numItems = this.numitems;
  213.           } else {
  214.             numItems = this.feedItems.length;
  215.           }
  216.           this.currentFeedItem--;
  217.           if (this.currentFeedItem < 0) {
  218.             this.currentFeedItem = numItems-1;
  219.           }
  220.           this.updateFeedItem();
  221.           ]]>
  222.         </body>
  223.       </method>
  224.  
  225.       
  226.  
  227.       <method name="nextFeedItem">
  228.         <parameter name="resetTimer" />
  229.         <body>
  230.           <![CDATA[
  231.           if (resetTimer) {
  232.             window.clearInterval(this.rotationTimer);
  233.             this.rotationTimer = 0;
  234.             this.startFeedRotation();
  235.           }
  236.           var numItems;
  237.           if ((this.numitems > -1) && (this.feedItems.length >= this.numitems)) {
  238.             numItems = this.numitems;
  239.           } else {
  240.             numItems = this.feedItems.length;
  241.           }
  242.           this.currentFeedItem++;
  243.           if (this.currentFeedItem >= numItems) {
  244.             this.currentFeedItem = 0;
  245.           }
  246.           this.updateFeedItem();
  247.           ]]>
  248.         </body>
  249.       </method>
  250.       <method name="readFeed">
  251.         <parameter name="feed" />
  252.         <parameter name="feedreader" />
  253.         <body>
  254.           if (!feedreader) {
  255.             feedreader = this;
  256.           }
  257.           <![CDATA[
  258.           if (!feed) {
  259.             feed = feedreader.currentfeed;
  260.           }
  261.           feedreader.feedItems = [];
  262.  
  263.           var xhr = new XMLHttpRequest();
  264.           xhr.open('GET', feed, true);
  265.           xhr.onload = function() {
  266.             feedreader.parseFeed(xhr.responseText);
  267.           }
  268.           xhr.send(null);
  269.           ]]>
  270.         </body>
  271.       </method>
  272.       <method name="parseFeed">
  273.         <parameter name="xml" />
  274.         <body>
  275.           <![CDATA[
  276.           var parser = new DOMParser();
  277.           var dom = parser.parseFromString(xml, 'text/xml');
  278.  
  279.           // check for error
  280.           if (dom.documentElement.nodeName == 'parsererror')
  281.             throw new Error('Could not parse feed');
  282.  
  283.           var xmlDoc = dom.documentElement;
  284.           switch (xmlDoc.nodeName.toLowerCase()) {
  285.             case 'feed':    this.parseAtom(xmlDoc); break;
  286.             case 'rdf:rdf': this.parseRss(xmlDoc); break;
  287.             case 'rss':     this.parseRss(xmlDoc); break;
  288.           }
  289.           if (this.feedItems.length > 0) {
  290.             this.currentFeedItem = 0;
  291.             this.updateFeedItem();
  292. //            this.startFeedRotation();
  293.           } else {
  294.             var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
  295.               feedReaderItemButton.setAttribute("label", "No Feed Items");
  296.           }
  297.  
  298.           ]]>
  299.         </body>
  300.       </method>
  301.       <method name="parseAtom">
  302.         <parameter name="xmlDoc" />
  303.         <body>
  304.           <![CDATA[
  305.             var domParser = new DOMParser();
  306.             var header = '<?xml version="1.0"?>\n'+
  307.                          '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n'+
  308.                          '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n'+
  309.                          '<html:html xml:lang="en" xmlns:html="http://www.w3.org/1999/xhtml">\n';
  310.             var footer = "</html:html>"
  311.             var entries = xmlDoc.getElementsByTagName('entry');
  312.             for (var i = 0; i < entries.length; i++) {
  313.               this.feedItems[i] = ['title', 'url'];
  314.  
  315.               //load the entry title
  316.               this.feedItems[i]['title'] = entries[i].getElementsByTagName('title')[0].textContent;
  317.               if (entries[i].getElementsByTagName('title')[0].hasAttribute("type") &&
  318.                   entries[i].getElementsByTagName('title')[0].getAttribute("type") == "html") {
  319.                 var e = domParser.parseFromString(header + this.feedItems[i]['title'] + footer, "text/xml")
  320.                 this.feedItems[i]['title'] = e.documentElement.textContent;                
  321.               }
  322.  
  323.               //if <id> is an absolute URL, use that
  324.               var elem = entries[i].getElementsByTagName('id');
  325.               for (var j = 0; j < elem.length; j++) {
  326.                 var kids = elem[j].childNodes;
  327.                 if (kids.length > 0) {
  328.                   var val = kids[0].nodeValue;
  329.                   if (val != null && val.match(/^http:\/\//)) {
  330.                     this.feedItems[i]['url'] = val;
  331.                     break;
  332.                   }
  333.                 }
  334.               }
  335.  
  336.  
  337.               //instead look for a <link> tag
  338.               if (this.feedItems[i]['url'] == null) {
  339.                 var elem = entries[i].getElementsByTagName('link');
  340.                 for (var j = 0; j < elem.length; j++) {
  341.                   var rel = elem[j].getAttribute('rel');
  342.                   if (rel == null || rel == 'alternate') {
  343.                     this.feedItems[i]['url'] = elem[j].getAttribute('href');
  344.                     break;
  345.                   }
  346.                 }
  347.               }
  348.  
  349.               if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
  350.                 throw new Error('Invalid feed');
  351.             }
  352.  
  353.           ]]>
  354.         </body>
  355.       </method>
  356.       <method name="parseRss">
  357.         <parameter name="xmlDoc" />
  358.         <body>
  359.           <![CDATA[
  360.           var items = xmlDoc.getElementsByTagName('item');
  361.           for (var i = 0; i < items.length; i++) {
  362.             this.feedItems[i] = ['title', 'url'];
  363.  
  364.             var titleElem = items[i].getElementsByTagName('title');
  365.             if (titleElem.length > 0)
  366.               this.feedItems[i]['title'] = titleElem[0].textContent;
  367.  
  368.             var linkElem = items[i].getElementsByTagName('link');
  369.             if (linkElem.length > 0)
  370.               this.feedItems[i]['url'] = linkElem[0].textContent;
  371.  
  372.             if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
  373.               throw new Error('Invalid feed');
  374.           }
  375.           ]]>
  376.         </body>
  377.       </method>
  378.     </implementation>
  379.   </binding>
  380.  
  381.   <binding id="feed"></binding>
  382. </bindings>
  383.